/*
 * @Description: 层级组件上下文
 * @Author: Rfan
 * @Date: 2022-06-21 10:25:48
 * @LastEditTime: 2022-11-04 11:32:19
 */

import { createContext, useContext, useReducer } from 'react';
import {
  ADD_LIST_ITEM,
  DELETE_LIST_ITEM,
  EDIT_LIST_ITEM,
  INIT_INFO,
  SET_CHANGE_METHOD,
  SET_COMPUTE_HEIGHT_SWITCH,
  SET_ENTRY_LIST,
  SET_LIST_HEIGHT,
  SET_SELECTED_ITEM,
  GET_GROUP_LIST,
  SET_FILTER_FIELDS,
  SET_LIST_QUERY
} from '../constants';
import { LevelTableReducer } from '../reducers/LevelTableReducer';
import {
  addArchiveItem,
  deleteArchiveItem,
  deleteERecords,
  editArchiveItem,
  generateArcSortNo,
  insertArchiveItem
} from '@/api/archives/archives';
import { message, Modal } from 'antd';
import { fromPairs } from 'lodash-es';
import { fileMerge, toOtherFolder, intraGroupEntry } from '@/api/archives/reorganization';

const initialState = {
  // 查询条件
  listQuery: {
    pageNo: 1,
    pageSize: 10,
    param: {}
  },
  // 当前档案类型ID
  currentAt: 0,
  // 本层级相关信息
  baseInfo: {},
  // 上级条目信息
  upperInfo: {},
  // 上级可展示条目信息
  upperFields: [],
  // 选中条目向外数据方法
  selectChange: null,
  // 选中的表格条目
  selectItems: [],
  // 条目列表
  list: [],
  // 是否计算表格高度，显示滚动条
  isComputeHeight: false,
  // 要设置的表单高度
  tableHeight: 0,
  // 同分组列表
  groupList: [],
  // 筛选字段
  filterFields: []
};

const LevelTableContext = createContext();

const LevelTableContextProvider = (props) => {
  const [state, dispatch] = useReducer(LevelTableReducer, initialState);

  const actions = {
    /**
     * @description: 表格选中的项目
     * @param {*} selectArr 选中的项目
     */
    setSelectedItem(selectArr) {
      dispatch({ type: SET_SELECTED_ITEM, data: selectArr });
    },

    /**
     * @description: 初始化接收的坐标及上级条目信息
     * @param {*} data 组件接收到的数据
     */
    initInfo(data) {
      dispatch({ type: INIT_INFO, ...data });
    },

    /**
     * @description: 设置列表请求参数
     * @param {*} data 请求参数
     */
    setListQuery(data) {
      dispatch({ type: SET_LIST_QUERY, data });
    },

    /**
     * @description: 选中条目向外数据方法
     * @param {*} func 函数本体
     */
    setChangeMethod(func) {
      dispatch({ type: SET_CHANGE_METHOD, data: func });
    },

    /**
     * @description: 设置是否计算高度开关
     * @param {boolean} data
     */
    setComputeHeightMethod(data) {
      dispatch({ type: SET_COMPUTE_HEIGHT_SWITCH, data });
    },

    /**
     * @description: 设置条目列表
     * @param {any[]} list
     */
    setEntryList(list) {
      dispatch({ type: SET_ENTRY_LIST, list });
    },

    /**
     * @description: 设置表格高度
     * @param {number} height 计算后的表格高度
     */
    setListHeight(height) {
      dispatch({ type: SET_LIST_HEIGHT, data: height });
    },

    /**
     * @description: 设置筛选字段
     * @param {IMetadata} data
     */
    setFilterFields(data) {
      dispatch({ type: SET_FILTER_FIELDS, data });
    },

    /**
     * @description: 增加列表条目
     * @param {any} params 接口参数
     */
    addArchiveItemFunc(params) {
      return new Promise((resolve) => {
        addArchiveItem(params).then((res) => {
          const { data } = res;
          message.success('添加成功');
          dispatch({ type: ADD_LIST_ITEM, data: data.data });
          resolve(data);
        });
      });
    },

    /**
     * @description: 编辑列表条目
     * @param {number} id 修改的id
     * @param {any} params 接口参数
     * @param {any} orgData
     */
    editArchiveItemFunc(id, params, orgData) {
      return new Promise((resolve) => {
        editArchiveItem(params).then((res) => {
          const { data } = res;
          const editData = fromPairs(data.map((item) => [item.fieldName, item.fieldValue]));
          message.success('编辑');
          dispatch({ type: EDIT_LIST_ITEM, data: { ...orgData, ...editData }, id });
          resolve(data);
        });
      });
    },

    /**
     * @description: 增加列表条目
     * @param {any} params 接口参数
     */
    insertArchiveItemFunc(params) {
      return new Promise((resolve) => {
        insertArchiveItem(params).then((res) => {
          const { data } = res;
          message.success('添加成功');
          dispatch({ type: ADD_LIST_ITEM, data: data.data });
          resolve(data);
        });
      });
    },

    /**
     * @description: 删除列表条目
     * @param {*} level 层级
     * @param {*} query 请求参数
     * @param {*} content 提示内容
     * @return {*}
     */
    deleteItem(level, query, content = '确认删除选中的条目？') {
      Modal.confirm({
        title: '删除',
        content,
        onOk() {
          if (level === 0) {
            deleteERecords(query).then((res) => {
              message.success('删除成功');
              const data = res.data.map((id) => parseInt(id, 10));
              dispatch({ type: DELETE_LIST_ITEM, ids: data });
            });
          } else {
            deleteArchiveItem(query).then((res) => {
              const data = res.data.map((id) => parseInt(id, 10));
              dispatch({ type: DELETE_LIST_ITEM, ids: data });
              message.success('删除成功');
            });
          }
        },
        onCancel() {
          console.log('Cancel');
        }
      });
    },
    /**
     * @description: 开始合并
     * @param {any} params
     * @param {Key} id
     * @param {string} content
     */
    startMerge(params, id, content = '注：条目合并后，被合并条目信息将“删除”至回收站') {
      Modal.confirm({
        title: '请确认执行条目合并',
        content,
        onOk() {
          fileMerge(params).then(() => {
            dispatch({ type: DELETE_LIST_ITEM, ids: id });
          });
        },
        onCancel() {
          console.log('Cancel');
        }
      });
    },
    /* 转移到其他分组 */
    goOtherFolder(
      params,
      id,
      content = '在移动档案时，系统将根据数据关联配置自动变更档案相关字段'
    ) {
      Modal.confirm({
        title: '提醒',
        content,
        onOk() {
          toOtherFolder(params).then(() => {
            dispatch({ type: DELETE_LIST_ITEM, ids: id });
          });
        },
        onCancel() {
          console.log('Cancel');
        }
      });
    },
    /* 获取同分组内列表 */
    getGroupList(params) {
      return new Promise((resolve) => {
        intraGroupEntry(params).then((res) => {
          const { data } = res;
          const { results } = data;
          dispatch({ type: GET_GROUP_LIST, data: results.data });
          resolve(results);
        });
      });
    },
    /**
     * @description: 通用 - 增加列表条目
     * @param {*} data 添加的条目
     */
    addTableItem(data) {
      dispatch({ type: ADD_LIST_ITEM, data });
    },

    /**
     * @description: 通用 - 编辑列表条目
     * @param {number} id 编辑的条目id
     * @param {*} data 编辑的条目
     */
    editTableItem(id, data) {
      dispatch({ type: EDIT_LIST_ITEM, data, id });
    },

    /**
     * @description: 通用 - 批量删除列表条目
     * @param {number[]} ids 删除的条目id列表
     */
    delTableItems(ids) {
      dispatch({ type: DELETE_LIST_ITEM, ids });
    },

    /**
     * @description: 生成档号
     * 目前先调用生成序号接口然后调用生成档号接口
     * @param {IGenerateNoParams} params
     */
    genArcNoFunc(params) {
      return new Promise((resolve, reject) => {
        generateArcSortNo(params)
          .then(() => {
            message.success('生成档号成功');
            resolve();
          })
          .catch((err) => {
            reject(err);
          });
      });
    }
  };

  return (
    <LevelTableContext.Provider value={{ ...state, ...actions }}>
      {props.children}
    </LevelTableContext.Provider>
  );
};

export const useLevelTableContext = () => {
  return useContext(LevelTableContext);
};

export { LevelTableContext, LevelTableContextProvider };
